/**
    package: learn-go
    filename: main
    author: diogo@gmail.com
    time: 2021/8/20 10:18
**/
package main

import (
	"fmt"
	"runtime"
	"time"
)

// 获取正在运行的函数名
func runFuncName() string {
	pc := make([]uintptr, 1)
	runtime.Callers(2, pc)
	f := runtime.FuncForPC(pc[0])
	return f.Name()
}

// CheckoutPageComponent 订单结算页面组件
type PageComponent struct {
	// 基础组件
	BaseComponent
}

// Do 执行组件&子组件
func (bc *PageComponent) Do(ctx *Context) (err error) {
	// 当前组件的业务逻辑写这
	fmt.Println(runFuncName(), "当前页面组件...")

	fmt.Println(ctx)
	// 执行子组件
	bc.ChildsDo(ctx)
	// 当前组件的业务逻辑写这
	return
}

// mi component
type Micomponent struct {
	BaseComponent
	miboject string
}

func (bc *Micomponent) Do(ctx *Context) (err error) {

	fmt.Println(runFuncName(), "mi组件...")
	//fmt.Println(ctx)
	fmt.Println(ctx.common)
	// 执行子组件
	bc.ChildsDo(ctx)
	// 当前组件的业务逻辑写这
	return
}

func main() {

	pageCom := &PageComponent{}

	// 初始化业务上下文 并设置超时时间
	ctx := GetContext(5 * time.Second)
	defer ctx.CancelFunc()

	pageCom.Mount(
		&Micomponent{},
	)

	pageCom.Do(ctx)

}
